;
;    Ok, this is the sceleton that MENUET 0.01 understands.
;    Do not change the header bits for now. Compile with nasm.
;
   
   
use32
   
                org   0x0
                db    'MENUET00'            ; 8 byte id
                dd    38                    ; required os
                dd    START                 ; program start
                dd    I_END                 ; program image size
                dd    0x100000              ; reguired amount of memory
                dd    0x00000000            ; reserved=no extended header
   
   
   
START:
   
    call  draw_window
   
still:
   
    mov       eax,10                 ; redraw ?
    int       0x40
   
    cmp    eax,1
    jz     red
    cmp    eax,3
    jz     button
    jmp    still
   
  red:
    call   draw_window
    jmp    still
   
  button:
    mov  eax,17
    int  0x40
   
    cmp  al,byte 0
    jnz  still
   
    cmp  ah,1
    jnz  noexit
   
    mov  eax,0xffffffff
    int  0x40
   
  noexit:
   
    cmp  ah,2
    jz   note1
   
    mov  eax,20   ; reset midi device
    mov  ebx,1
    mov  ecx,0
    int  0x40
   
    cmp  eax,0
    jz   noe1
   
    call printerror
   
  noe1:
   
    jmp  still
   
  note1:
   
    mov  eax,50
   
  nn:
   
    mov  ebx,100
    call noteout
    pusha
    mov  eax,5
    mov  ebx,8
    int  0x40
    popa
    mov  ebx,0
;    call noteout
   
    add  eax,3
   
    mov  ebx,100
    call noteout
    pusha
    mov  eax,5
    mov  ebx,8
    int  0x40
    popa
    mov  ebx,0
;    call noteout
   
    add  eax,4
   
    inc  eax
    cmp  eax,90
    jbe  nn
   
    jmp  still
   
   
draw_window:
   
    pusha
   
    mov       eax,12                    ; tell os about redraw
    mov       ebx,1
    int       0x40
   
    mov       eax,0                     ; define and draw window
    mov       ebx,20*65536+250
    mov       ecx,20*65536+120
    mov       edx,0x02ffffff
    mov       esi,0x805070d0;88ccee
    mov       edi,0x005070d0;88ccee
    int       0x40
   
                                        ; CLOSE BUTTON
    mov       eax,8                     ; function 8 : define and draw          
    mov       ebx,(250-19)*65536+12     ; [x start] *65536 + [x size]
    mov       ecx,5*65536+12            ; [y start] *65536 + [y size]
    mov       edx,1                     ; button id
    mov       esi,0x5577cc              ; button color RRGGBB
    int       0x40
   
   
    mov       eax,4                     ; 4 = write text
    mov       ebx,8*65536+8
    mov       ecx,dword 0x00ffffff      ; 8b window nro - RR GG BB color
    mov       edx,labelt                ; pointer to text beginning
    mov       esi,labellen-labelt       ; text length
    int       0x40
   
    mov       eax,8
    mov       ebx,10*65536+200          ; button start x & size
    mov       ecx,40 *65536+17          ; button start y & size
    mov       edx,2                     ; button number
    mov       esi,0x4060b0              ; button color
    int       0x40
   
    mov       eax,8
    mov       ebx,10*65536+200          ; button start x & size
    mov       ecx,60 *65536+17          ; button start y & size
    mov       edx,3                     ; button number
    mov       esi,0x4060b0              ; button color
    int       0x40
   
    mov       eax,dword 4
    mov       ebx,25*65536+45
    mov       ecx,dword 0xffffff
    mov       edx,buttont
    mov       esi,buttontlen-buttont
    int       0x40
   
    mov       eax,dword 4
    mov       ebx,25*65536+65
    mov       ecx,dword 0xffffff
    mov       edx,buttont2
    mov       esi,buttontlen2-buttont2
    int       0x40
   
    mov       eax,12                    ; tell os about redraw end
    mov       ebx,2
    int       0x40
   
    popa
    ret
   
   
noteout:
   
    pusha
   
    push ebx
    push eax
   
    mov  eax,20
    mov  ebx,2
    mov  ecx,0x9f
    int  0x40
    mov  eax,20
    mov  ebx,2
    pop  ecx
    int  0x40
    mov  eax,20
    mov  ebx,2
    pop  ecx
    int  0x40
   
    cmp  eax,0
    jz   noe2
   
    call printerror
   
  noe2:
   
    popa
    ret
   
printerror:
   
    mov       eax,dword 4
    mov       ebx,15*65536+85
     mov       ecx,0x000000
     mov       edx,error1
    mov       esi,errorlen1-error1
    int       0x40
   
    mov       eax,dword 4
    mov       ebx,15*65536+95
     mov       ecx,0x000000
     mov       edx,error2
    mov       esi,errorlen2-error2
    int       0x40
   
    ret
   
   
; DATA AREA
   
   
labelt:
    db   'MIDI TEST'
labellen:
   
buttont:
    db   'PLAY A FEW NOTES'
buttontlen:
buttont2:
    db   'RESET MIDI DEVICE'
buttontlen2:
   
error1:
    db   'NO BASE DEFINED FOR MPU-401'
errorlen1:
   
error2:
    db   'USE SETUP AND RESET MIDI DEVICE.'
errorlen2:
   
base db 0x0
   
   
I_END:
